<!doctype html>
<html lang="zh">
<head>
  <meta charset="utf-8">
  <title>KISSY - 全终端适配的 JS 类库</title>
  <meta name="viewport" content="width=device-width">
  <link href="http://fonts.googleapis.com/css?family=Droid+Sans|Lekton|Ubuntu+Mono:400,700" rel="stylesheet">
	<link rel="stylesheet" href="templates/assets/bootstrap.css">
	<link href="templates/assets/normalize.css" rel="stylesheet">
	<link href="templates/assets/kissy.css" rel="stylesheet">
	<link href="templates/assets/prettify.css" rel="stylesheet">
	<link href="templates/assets/forkit.css" rel="stylesheet">
	<script src="templates/assets/jquery.min.js"></script>
	<script src="templates/assets/script.js" type="text/javascript"></script>
	<script src="http://g.tbcdn.cn/trip/kissy/1.4.0/seed-min.js"></script>
	<script src="api/assets/highlight.pack.js"></script>
	<link href="api/assets/tomorrow-night-bright.css" rel=stylesheet />
	<link rel="shortcut icon" href="http://a.tbcdn.cn/s/kissy/favicon.ico">
</head>

<body class="">
    <nav id="sidebar">
    <header>
		<a href="index.html">
			<!--img src="http://gtms04.alicdn.com/tps/i4/T1ceiPFbpcXXcljp_h-200-89.png"-->
			<!--img src="templates/assets/img/logo_6.png"-->
			<!--img src="http://gtms04.alicdn.com/tps/i4/T14oa2FcNcXXaOySEh-180-104.png" alt="" /-->
			<!--img src="http://gtms01.alicdn.com/tps/i1/T1Amq1FaXgXXbXVSUh-180-127.png" alt="" /-->
			<img src="http://gtms02.alicdn.com/tps/i2/T1N0jTXXXjXXay7Rri-175-78.png" alt="" />
		</a>
	</header>
    <ul>
      <li class="nav-divider"><a href="index.html"><img src="templates/assets/img/icon-home.png">首页</a></li>
      <li class="nav-divider"><a href="why-kissy.html"><img src="templates/assets/img/icon-why.png">Why KISSY?</a></li>
      <li><a href="get-started.html"><img src="templates/assets/img/icon-getting-started.png">KISSY 1.4.x 教程大纲</a></li>
      <li class="nav-sub"><a href="module-map.html">核心模块列表</a></li>
      <li class="nav-sub"><a href="kmd.html">KISSY 模块规范 (KMD)</a></li>
      <li class="nav-sub"><a href="gbs.html">浏览器兼容基准(GBS)</a></li>
      <li class="nav-sub"><a href="http://cyj.me/jquery-kissy-rosetta/">jQuery KISSY 对比手册</a></li>
      <li class="nav-sub"><a href="http://gallery.kissyui.com/guide">KISSY 组件开发规范</a></li>
      <li class="nav-sub nav-divider"><a href="history.html">历史版本</a></li>
      <li><a href="">API Doc</a></li>
      <li><a href="http://demo.kissyui.com">Demos</a></li>
      <li class="nav-divider"><a href="http://gallery.kissyui.com">KISSY Gallery</a></li>
      <li><a href="tools.html">KISSY 项目构建工具</a></li>
      <li class="nav-sub"><a href="kmc.html">KS Module Compiler</a></li>
      <li class="nav-sub"><a href="http://abc.f2e.taobao.net">ABC</a></li>
      <li class="nav-sub nav-divider"><a href="clam.html">Clam</a></li>
      <li><a href="third-party-lib.html">第三方代码库</a></li>
      <li class="nav-sub"><a href="https://github.com/lorrylockie/tpap/wiki">面向第三方安全的 KISSY</a></li>
      <li class="nav-sub"><a href="http://www.builive.com/demo/index.php">BUI</a></li>
      <li class="nav-sub nav-divider"><a href="http://work.tmall.net/muidoc/build/">MUI</a></li>
      <li><a href="https://github.com/kissyteam/kissy/blob/master/CONTRIBUTING.md">为 KISSY Core 贡献代码</a></li>
      <li class="nav-sub"><a href="http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml">HTML/CSS编码规范</a></li>
      <li class="nav-sub nav-divider"><a href="http://docs.kissyui.com/source/tutorials/style-guide/google/javascriptguide.xml">JavaScript 编码规范</a></li>
	  <li><a href="upgrade.html"><img src="templates/assets/img/icon-documentation.png">1.3.x->1.4.0 升级指南</a></li>
	  <li><a href="faq.html"><img src="templates/assets/img/icon-faqs.png">FAQ</a></li>
      <li><a href="https://github.com/kissyteam/kissy"><img src="templates/assets/img/icon-github.png">GitHub</a></li>
	  <li><a href="core-team.html"><img src="templates/assets/img/icon-google-plus.png">KISSY 核心小组</a></li>
    </ul>
  </nav>

  <div id="content">
    <article>
      

	<h1>在Node环境中运行kissy</h1>
<p>KISSY 可以运行在 Node 环境中，由于KISSY下辖多数模块都依赖于DOM，只有seed、oo、base、xtemplate等组件可以完整运行于 Node，因此要获得Dom支持需要载入node模块<code>jsdom</code>，jsdom 可以在服务器端生成一套完整的浏览器宿主环境。</p>
<h2>在 node 环境中安装 kissy</h2>
<p>这里使用了<a href="https://github.com/tmpvar/jsdom">JSDom</a> 来生成服务端的浏览器宿主环境，KISSY 可以和任何合法的 DOM 树结构一起工作。</p>
<pre><code>npm install kissy jsdom</code></pre>
<h2>创建页面 DOM 骨架</h2>
<p>JSDom 有非常多有用的特性，并且是高可配置的。下面的代码用JSDom创建了一个简单的浏览器页面环境，最重要的，创建了document 和window。</p>
<pre><code>var jsdom = require(&#39;jsdom&#39;);

// 将没用的特性都关掉
jsdom.defaultDocumentFeatures = {
    // 不需要载入外部资源
    FetchExternalResources   : false,
    // 不需要处理外部资源
    ProcessExternalResources : false,
    // 关掉随机的事件响应（处于性能考虑）
    MutationEvents           : false,
    // 不需要浏览器自带的Css选择器
    QuerySelector            : false
};

var dom = jsdom.defaultLevel;

// 创建一个document和window
var document = 
    jsdom.jsdom(&quot;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;Hello kissy!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;&quot;),
window = document.createWindow();</code></pre>
<h2>将 KISSY 运行起来</h2>
<pre><code>var KISSY = require(&#39;kissy&#39;);

KISSY.use(&#39;node&#39;,function(S){
    S.log(S.one(&#39;body&#39;).html());
});</code></pre>
<p>结果输出：</p>
<pre><code>&lt;h1&gt;Hello kissy!&lt;/h1&gt;</code></pre>
<h2>执行 Dom 操作</h2>
<p>我们增加一点代码，初始化一个Button组件：</p>
<pre><code>// 引用node和button
KISSY.use(&#39;node,button&#39;,function(S,N,Button){

    // 常见的 DOM 操作
    S.Node(&#39;&lt;div id=&quot;J&quot;&gt;&lt;/div&gt;&#39;)
        .appendTo(&#39;body&#39;);

    // 生成一个Button
    var b = new Button({
        content:&#39;hello jayli&#39;,
        render:&#39;#J&#39;
    }).render();

    S.log(S.one(&#39;body&#39;).html());
});</code></pre>
<p>输出结果为：</p>
<pre><code>&lt;h1&gt;Hello kissy!&lt;/h1&gt;
&lt;div id=&quot;J&quot;&gt;
    &lt;div class=&quot;ks-button ks-button-shown&quot; 
            role=&quot;button&quot; 
            style=&quot;display: ;&quot; 
            tabindex=&quot;0&quot; 
            hidefocus=&quot;true&quot;&gt;
        hello jayli
    &lt;/div&gt;
&lt;/div&gt;</code></pre>
<p>这就是我们想要的结果，KISSY 已经成功的渲染了一个button组件</p>
<h2>使用add()和use()进行代码管理</h2>
<p>NodeJS 遵循 <a href="http://www.commonjs.org">CommonJS</a> 规范，文件本身就是一个封闭的上下文。而 KISSY 遵循 <a href="kmd.html">KMD</a> 规范。通过固定的模块书写格式来约定模块上下文，除了包装格式不同外，对于模块的定义是完全一致的。因此，在Node环境中也可以使用use()和add()来管理代码。使用方式请参照<a href="kmd.html">KMD规范</a>。</p>
<pre><code>var KISSY = require(&#39;kissy&#39;);

// 注册模块a
KISSY.add(&#39;a&#39;,function(S){
    return {
        // A的模块返回
    };
});

// 使用模块a
KISSY.use(&#39;a&#39;,function(S,A){
    // Your code...    
});</code></pre>
<p>在服务器端模块的载入都是阻塞式的，因此无需预定义Modules列表，即不用预先<code>KISSY.config(&#39;modules&#39;,{})</code>来定义模块依赖。</p>
<h2>FAQ</h2>
<p>1，执行<code>eval()</code>时如果带有对KISSY的引用，会报错<code>KISSY is not defined</code>。比如在引用XTemplate的时候，要这样来获得KISSY全局对象</p>
<pre><code>global.KISSY=require(&#39;kissy&#39;);</code></pre>


<div id="disqus_thread"></div>
<script>
    if((window.location.hostname.indexOf("kissyui.com")!=-1 )&& window.localStorage.getItem("kissy-commment")!="0"){
    /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
    var disqus_shortname = 'kissy-docs'; // required: replace example with your forum shortname

    // The following are highly recommended additional parameters. Remove the slashes in front to use.
     //var disqus_identifier = '/anim';
     //var disqus_url = window.location;

    /* * * DON'T EDIT BELOW THIS LINE * * */
    (function() {
        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
        dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    })();
    }
</script>



      
  <style>
	.github-btn {
		border: 0 none;
		overflow: hidden;
		margin-top:4px;
	}
	footer {
		border-top:1px solid #e2e2e2;
		padding-top:20px;
		clear:both;
	}
	/* iPhone 及以下 */
	@media only screen and (max-width: 767px) {
		.github-link {
			display:none;
		}
	}
  </style>
  <footer>




	<div class="text-center">
		©2013 - 2033 KISSY UI LIBRARY
		<br /> <iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=kissyteam&amp;repo=kissy&amp;type=watch&amp;count=true" width="100" height="20" title="Star on GitHub"></iframe> 
	<iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=kissyteam&amp;repo=kissy&amp;type=fork&amp;count=true" width="102" height="20" title="Fork on GitHub"></iframe>
	</div>
  </footer>
    </article>
  </div>
  <a target="_blank" href="https://github.com/kissyteam/kissy" class="github-link"><img alt="Fork me on GitHub" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" style="position: absolute; top: 0; right: 0; border: 0; z-index: 50"></a>
  <script>
	var S = KISSY;
	(function(){
		S.use('node',function(S){
			S.all('code').each(function(node){
				var className = node.attr('class');
				if(/^lang-/.test(className)){
					var tc = className.replace(/^lang-/,'');
					node.replaceClass(className,tc);
				}
			});
			hljs.tabReplace = '    ';
			hljs.initHighlighting();
		});
	})();
	(function(){
		var h3s = document.getElementsByTagName('h3');
		for(var i = 0;i<h3s.length;i++){
			var str = S.trim(h3s[i].innerHTML);
			try{
				str = str.match(/\w+/)[0];
			}catch(e){
				continue;
			}
			h3s[i].innerHTML = '<a name="'+str+'"></a>' + h3s[i].innerHTML;
		}
	})();
  </script>
</body>
</html>
